/*
 * author: Mladen Krstic (mladen.krstic@tfzr.rs)
 *  © 2010 All rights reserved
 */

package com.mladen;

import com.google.api.javame.Translate;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.control.VolumeControl;
import javax.microedition.midlet.MIDlet;

/**
 *
 * @author mladen
 */
public class AudioPlayer extends Thread {

    private String txt;
    private String to;
    private String url;
    private gTranslation midlet;
    private Displayable displayable;

    public static boolean isRunning = false;
    public AudioPlayer(String txt, String to, MIDlet midlet, Displayable displayable) {
        this.txt = txt;
        if (txt.trim().length() > 100) {
            txt = txt.trim().substring(0, 99);
        }
        this.to = to;
        if (to.equals("sl")) {
            to = "slo";
        } 
        url = "http://translate.google.com/translate_tts?tl=" + to + "&q=" + urlEncode(txt);
        this.midlet = (gTranslation) midlet;
        this.displayable = displayable;
    }
    public void run() {
        isRunning = true;
        playAudio();

    }
    public void playAudio(){
        try {
            if (to.equals("")){ // detektuj
                try {
                    to = Translate.getAutoDetectedLanguage(txt);
                } catch (Exception ex) {
                    throw new MediaException();
                }
            }
            if (to.equals("ru") || to.equals("sr")) {
                throw new IOException();
            } else if (to.equals("sl")) {
                to = "slo";
            }
            HttpConnection conn = (HttpConnection)Connector.open(url, Connector.READ_WRITE);
            InputStream is = conn.openInputStream();
            Player player = Manager.createPlayer(is, "audio/mpeg");
            player.realize();
            VolumeControl vc = (VolumeControl) player.getControl("VolumeControl");
            if(vc != null) {
                vc.setLevel(100);
            }
            player.prefetch();
            if (!gTranslation.isCanceledRequest()) {
                player.start();
            }
            midlet.switchDisplayable(null, displayable);
            
        } catch (IOException ioe) {
            Alert at = new Alert("Error", "This language is not supported in Google Text-To-Speech unofficial API", null, AlertType.ERROR);
            Display.getDisplay(midlet).setCurrent(at, displayable);
            ioe.printStackTrace();
        } catch (MediaException me) {
            Alert at = new Alert("Error", "Cannot create audio player.", null, AlertType.ERROR);
            Display.getDisplay(midlet).setCurrent(at, displayable);
        } catch (SecurityException se) {
            Alert at = new Alert("Error", "Your phone doesn't support audio streaming", null, AlertType.ERROR);
            Display.getDisplay(midlet).setCurrent(at, displayable);
            se.printStackTrace();
        } finally {
            isRunning = false;

        }


    }
    public static String urlEncode(String s) {
    StringBuffer sbuf = new StringBuffer();
    int len = s.length();
    for (int i = 0; i < len; i++) {
        int ch = s.charAt(i);
        if ('A' <= ch && ch <= 'Z') { // 'A'..'Z'
            sbuf.append((char)ch);
        } else if ('a' <= ch && ch <= 'z') { // 'a'..'z'
            sbuf.append((char)ch);
        } else if ('0' <= ch && ch <= '9') { // '0'..'9'
            sbuf.append((char)ch);
        } else if (ch == ' ') { // space
            sbuf.append('+');
        } else if (ch == '-' || ch == '_'   //these characters don't need encoding
                || ch == '.' || ch == '*') {
            sbuf.append((char)ch);
        } else if (ch <= 0x007f) { // other ASCII
            sbuf.append(hex(ch));
        } else if (ch <= 0x07FF) { // non-ASCII <= 0x7FF
            sbuf.append(hex(0xc0 | (ch >> 6)));
            sbuf.append(hex(0x80 | (ch & 0x3F)));
        } else { // 0x7FF < ch <= 0xFFFF
            sbuf.append(hex(0xe0 | (ch >> 12)));
            sbuf.append(hex(0x80 | ((ch >> 6) & 0x3F)));
            sbuf.append(hex(0x80 | (ch & 0x3F)));
        }
    }
    return sbuf.toString();
}
    

    static String hex(int sym) {
     return(hex.substring(sym*3, sym*3 + 3));
 }
    final static String hex =
"%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" +
"%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f" +
"%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f" +
"%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f" +
"%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f" +
"%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf" +
"%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df" +
"%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff";

}
